<?php
/**
 * lk 框架入口
 * @author yangzhiguo www.amiaoagou.com <yangzhiguo0903@163.com> 2011-02-21
 */
if(version_compare(PHP_VERSION,'5.0.0','<'))
{
	die('require PHP > 5.0 !');
}
define('BEGIN_TIME', microtime(true));//记录开始运行时间
define('TIME', isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time());  //系统时间
define('IN_LK', true);  //程序入口
!defined('APP_ROOT') && define('APP_ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);  //框架路径
!defined('LK_ROOT') && define('LK_ROOT', substr(APP_ROOT, 0, -3));  //程序路径 带末尾'/'
define('CACHE_PATH', LK_ROOT . 'cache' . DIRECTORY_SEPARATOR);  //缓存路径 带末尾'/'
define('CONF_PATH', CACHE_PATH . 'config' . DIRECTORY_SEPARATOR);  //配置文件路径 带末尾'/'
define('CONTROLLERS_PATH', APP_ROOT . 'controllers' . DIRECTORY_SEPARATOR);//模型 即模块地址
define('LOG_PATH', CACHE_PATH . 'log' . DIRECTORY_SEPARATOR);  //脚本错误日志地址
include CONF_PATH . 'site.defines.php';  //引入自定义site defines
define('LANG_PATH', APP_ROOT . 'lang' . DIRECTORY_SEPARATOR . LANG . DIRECTORY_SEPARATOR);  //基础语言包地址
lk::lf('global');
function_exists('date_default_timezone_set') && date_default_timezone_set(TIMEZONE);  //设置本地时间
ERRORLOG ? set_error_handler('lkerror') : error_reporting(0);  //错误处理调用
(GZIP && function_exists('ob_gzhandler')) ? ob_start("ob_gzhandler") : ob_start();
header('Content-Type : text/html; charset=' . CHARSET);

class lk
{
    /**
     * 初始化应用程序
     */
	public static function run()
	{
		return self::lo('controller');
	}

    /**
	 * 加载模型
	 */
	public static function load_model($modelname)
	{
		$model = self::lo($modelname . '_model', 'models' . DIRECTORY_SEPARATOR);
		if(!$model)
		{
			exit(sprintf(LANG('undefined_model'), $modelname));
		}
		return $model;
	}
	
    /**
     * 加载模块函数库 lf_modules
	 * @param string $funcname 模块函数文件名 非完整文件名 .func.php
	 * @param string $mod 模块名称
	 * @return boolean
	 */
	public static function lf_app($funcname, $mod = '')
	{
		if(empty($mod) && defined('M'))	//默认的模型
		{
			$mod = M;
		}
		if(empty($mod))
		{
			return false;
		}
		return self::lf($funcname, 'controllers' . DIRECTORY_SEPARATOR . $mod . DIRECTORY_SEPARATOR . 'functions' . DIRECTORY_SEPARATOR);
	}
	
    /**
     * 加载模块应用类文件 lo_app
	 * @access public
	 * @param string $classname 类名 非文件名
	 * @param string $model     模块名 
	 * @param boolean $initialize 是否自动加载
	 * @return mixed 
	 */
	public static function lo_app($classname, $model, $initialize = 1)
	{
		$path = 'controllers' . DIRECTORY_SEPARATOR . $model . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR;
		return self::lo($classname, $path, $initialize);
	}
	
    /**
     * 加载类文件 lo
	 * @access public
	 * @param string $classname 类名 非文件名
	 * @param string $path 类所在地址 不带后面的/ 地址相对于程序根目录
	 * @param boolean $initialize 是否自动加载
	 * @return mixed 
	 */
	public static function lo($classname, $path = '', $initialize = true)
	{
		static $classes = array();
		if(!$path)
		{
			$path = 'libs' . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR;
		}
		$key = md5($path . $classname);
		if(isset($classes[$key]))
		{
			if($classes[$key] === true)
			{
				return true;
			}
			else
			{
				return $classes[$key];
			}
		}
		if(is_file(APP_ROOT . $path . $classname . '.class.php'))
		{
			include APP_ROOT . $path . $classname . '.class.php';
			if($initialize)
			{
				$classes[$key] = new $classname;
			}
			else
			{
				$classes[$key] = true;
			}
			return $classes[$key];
		}
		else
		{
			return false;
		}
	}
	
    /**
     * 加载配置文件 lc
	 * @access public
	 * @param string $configname 配置文件名 非完整文件名 .config.php
	 * @param string $path 文件所在地址 不带后面的/ 地址相对于程序根目录
	 * @param string $key  配置数组的键值
	 * @param boolean $reload 是否重新加载
	 * @return boolean
	 */
	public static function lc($configname, $key = '', $path = '', $reload = false)
	{
		static $configs = array();
		if(!$reload && isset($configs[$configname]))
		{
			if(empty($key))
			{
				return $configs[$configname];
			}
			else if(isset($configs[$configname][$key]))
			{
				return $configs[$configname][$key];
			}
			else
			{
				return false;
			}
		}
		if(!$path)
		{
			$path = CONF_PATH . $configname . '.config.php';
		}
		if(is_file($path))
		{
			$configs[$configname] = include $path;
		}
		if(empty($key))
		{
			return $configs[$configname];
		}
		else if(isset($configs[$configname][$key]))
		{
			return $configs[$configname][$key];
		}
		else
		{
			return false;
		}
	}
	
    /**
     * 加载函数库 lf
	 * @access public
	 * @param string $funcname 函数文件名 非完整文件名 .func.php
	 * @param string $path 文件所在地址 必须带后面的/ 地址相对于程序根目录
	 * @return boolean
	 */
	public static function lf($funcname, $path = '')
	{
		static $funcs = array();
		if(!$path)
		{
			$path = 'libs' . DIRECTORY_SEPARATOR . 'functions' . DIRECTORY_SEPARATOR;
		}
		$key = md5($path . $funcname);
		if(isset($funcs[$key]) && $funcs[$key] === true)
		{
			return true;
		}
		if(is_file(APP_ROOT . $path . $funcname . '.func.php'))
		{
			include APP_ROOT . $path . $funcname . '.func.php';
			$funcs[$key] = true;
			return true;
		}
		else
		{
			$funcs[$key] = false;
			return false;
		}
	}
}